home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************/
- /*** Vector Library ***/
- /***************************************************************************/
- #include <math.h>
- #ifndef M_PI
- #define M_PI 3.14159265358979323846
- #endif
-
- typedef double SKALAR;
- typedef SKALAR VECTOR[3];
- typedef SKALAR *VEC;
-
-
- /* get memory[1] */
- #define vecnew(v) (v=(VEC)malloc(3*sizeof(SKALAR)))
-
- /* assignment */
- #define vecasn(r,a) (((r)[0]=(a)[0]),((r)[1]=(a)[1]),((r)[2]=(a)[2]))
- #define veccpy(r,a) vecasn(r,a)
-
- /* set r=special vectors */
- #define vec0(r) ((r)[0]=0,(r)[1]=0,(r)[2]=0)
- #define vecx(r) ((r)[0]=1,(r)[1]=0,(r)[2]=0)
- #define vecy(r) ((r)[0]=0,(r)[1]=1,(r)[2]=0)
- #define vecz(r) ((r)[0]=0,(r)[1]=0,(r)[2]=1)
-
- /* scalar product */
- #define dot(a,b) ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
-
- /* r=a-b, r=a+b */
- #define vecsub(r,a,b) (((r)[0]=(a)[0]-(b)[0]),\
- ((r)[1]=(a)[1]-(b)[1]),\
- ((r)[2]=(a)[2]-(b)[2]))
- #define vecadd(r,a,b) (((r)[0]=(a)[0]+(b)[0]),\
- ((r)[1]=(a)[1]+(b)[1]),\
- ((r)[2]=(a)[2]+(b)[2]))
-
- /* abs(a) */
- #define vecabs(a) (sqrt((a)[0]*(a)[0]+(a)[1]*(a)[1]+(a)[2]*(a)[2]))
-
- /* distance a,b */
- SKALAR distance(VECTOR a,VECTOR b);
-
- /* projection: dot(r*a,b-r*a)=0 */
- #define dist2(a,b) (dot(a,b)/dot(a,a))
-
- /* scaling r=s*a */
- #define vecmul(r,s,a) (((r)[0]=(s)*(a)[0]),\
- ((r)[1]=(s)*(a)[1]),\
- ((r)[2]=(s)*(a)[2]))
- #define vecscale(r,s,a) vecmul(r,s,a)
- #define vecneg(r,a) ((r)[0]=-(a)[0],(r)[1]=-(a)[1],(r)[2]=-(a)[2])
-
- /* cross product r=a x b */
- void vecprod(VECTOR r,VECTOR a,VECTOR b);
-
- /* r = normalized a */
- void norm(VECTOR r, VECTOR a);
-
- /* r= normal of plain v1,v2,v3 */
- /* right hand system: v2-v1, v3-v1, r */
- void mknormal(VECTOR r,VECTOR v1,VECTOR v2,VECTOR v3);
-
- /*************** Coordinate base transformation **************************/
- /* r= (a from (u,v,w) basis to standard basis) */
- void transformc(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w);
-
- /* determinant of (u,v,w) */
- #define det(u,v,w) ((u)[0]*(v)[1]*(w)[2] \
- +(u)[1]*(v)[2]*(w)[0] \
- +(u)[2]*(v)[0]*(w)[1] \
- -(u)[2]*(v)[1]*(w)[0] \
- -(u)[1]*(v)[0]*(w)[2] \
- -(u)[0]*(v)[2]*(w)[1])
-
- /* r= (a from standard basis to (u,v,w) basis) */
- /* returns 0 when impossible */
- int transformd(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w);
-
- /*************** Scaling and Rotation *************************************/
- /* r=scale(a,b) */
- #define scale(r,a,b) ((r)[0]=(a)[0]*(b)[0],\
- (r)[1]=(a)[1]*(b)[1],\
- (r)[2]=(a)[2]*(b)[2])
-
-
- /* r=left hand rotation of b with a around x y z */
- void rotxyz(VECTOR r,VECTOR a,VECTOR b);
-
- /* r=get xyz rotation: (a=former x, b=former y, c=former z) */
- void getrotxyz(VECTOR r,VECTOR a,VECTOR b,VECTOR c);
-
-